package com.example.order.feign;

import com.example.order.feign.fallback.ProductFeignClientFallback;
import com.example.product.pojo.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * feign 客户端：发起远程调用的客户端
 */
@FeignClient(value = "service-product", fallback = ProductFeignClientFallback.class)
public interface ProductFeignClient {

    /**
     * 本地的@Controller（处理请求）：Controller注解：接收请求，做服务端路由。
     * 远程调用的@FeignClient（代理请求）：FeignClient注解：发起请求，做客户端代理。
     * 场景           使用角色            主要注解                                        目的                                      核心逻辑
     * Controller    服务器端（Server）   @RequestMapping @GetMapping @PostMapping 等    接收外部HTTP请求，解析参数，调用本地方法处理    把HTTP请求映射到方法执行
     * FeignClient   客户端（Client）    @RequestMapping @GetMapping @PostMapping 等    构造HTTP请求，发起远程调用，代理远程方法        把方法调用封装成HTTP请求发送出去
     */

    /**
     * MVC注解的两套使用逻辑
     * 1.标注在 Controller 上，是接收这样的请求 -> 返回对应的数据（后端接收前端请求，后端返回数据）
     * 2.标注在 FeignClient 上，是发送这样的请求 -> 返回对应的数据（服务1向服务2发送请求，服务2返回数据）
     */
    @GetMapping("/{id}")
    Product getProductById(@PathVariable("id") Long id);

}